package cn.ymkj.utils;

import cn.ymkj.pojo.User;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;

/**
 * jwt的工具类
 */
public class MyTokenUtil {
    //设置token的有效期，自定义，但是不建议时间太长，单位毫秒，1小时
    private static final long EXPIRE_TIME= 60*60*1000;
    /**
     * 加密的盐值，自定义，因为token是存放在客户端，如果不加密，不安全，连接数据库的话使用user表的盐值
     */
    private static final String TOKEN_SECRET="yunmaikeji";
    /**
     * 生成token，返回一个经过加密的token
     */
    public static String sign(User user){
        String token = null;
        try {
            //设置过期时间
            Date expiresAt = new Date(System.currentTimeMillis() + EXPIRE_TIME);
            //使用jwt生成token
            token = JWT.create()
                    // 设置生成token的组成元素，具体要哪些元素来组成，这个是自定义的
                    .withIssuer("5997CK")  //设置签发者，自定义
                    .withClaim("username", user.getUsername()) //用户信息
                    .withExpiresAt(expiresAt) //设置token的过期时间
                    // 使用了HMAC256加密算法。
                    .sign(Algorithm.HMAC256(TOKEN_SECRET)); //传入盐值，进行加密
        } catch (Exception e){
            e.printStackTrace();
        }
        return token;
    }
    /**
     * token验证
     */
    public static boolean verify(String token){
        try {
            JWTVerifier verifier = JWT.require(Algorithm.HMAC256(TOKEN_SECRET)).withIssuer("5997CK").build();
            DecodedJWT jwt = verifier.verify(token);
            System.out.println("认证通过：");
            System.out.println("username：" + jwt.getClaim("username").asString());
            System.out.println("过期时间：" + jwt.getExpiresAt()); //打印token的过期时间
            return true;
        } catch (Exception e){
            return false;
        }
    }

}